/**
 * @description 添加单位
 * @param {unknown} value
 * @return {Boolean}
 */
export const isEmpty = (value: unknown) => {
  return value == null && typeof value == "undefined";
};

/**
 * @description 树转数组，队列实现广度优先遍历
 * @param {Array} data  数据
 * @param {Object} props `{ children: 'children' }`
 */

export const treeToArray = (data: any[], props = { children: "children" }) => {
  data = cloneDeep(data);
  const { children } = props;
  const newData = [];
  const queue: any[] = [];
  data.forEach((child: any) => queue.push(child));
  while (queue.length) {
    const item: any = queue.shift();
    if (item[children]) {
      item[children].forEach((child: any) => queue.push(child));
      delete item[children];
    }
    newData.push(item);
  }
  return newData;
};

/**
 * @description 数组转
 * @param {Array} data  数据
 * @param {Object} props `{ parent: 'pid', children: 'children' }`
 */

export const arrayToTree = (
  data: any[],
  props = { id: "id", parentId: "pid", children: "children" }
) => {
  data = cloneDeep(data);
  const { id, parentId, children } = props;
  const result: any[] = [];
  const map = new Map();
  data.forEach(item => {
    map.set(item[id], item);
    const parent = map.get(item[parentId]);
    if (parent) {
      parent[children] = parent[children] ?? [];
      parent[children].push(item);
    } else {
      result.push(item);
    }
  });
  return result;
};

/**
 * 获取格式化时间数字 包含毫秒
 * @param dateTime
 */
export const getTimeMillisFormate = (dateTime: Date) => {
  return (
    dateTime.getFullYear().toString() +
    (dateTime.getMonth() + 1).toString().padStart(2, "0") +
    dateTime.getDate().toString().padStart(2, "0") +
    dateTime.getHours().toString() +
    dateTime.getMinutes().toString() +
    dateTime.getSeconds().toString() +
    String(dateTime.getMilliseconds()).padStart(3, "0")
  );
};

/**
 * 时间格式化
 * @param dateTime
 * @param fmt
 */
export const timeFormatDate = (dateTime: Date, fmt = "yyyy-MM-dd HH:mm:ss") => {
  if (!dateTime) {
    dateTime = new Date();
  }
  let ret;
  const opt: any = {
    "y+": dateTime.getFullYear().toString(), // 年
    "M+": (dateTime.getMonth() + 1).toString(), // 月
    "d+": dateTime.getDate().toString(), // 日
    "H+": dateTime.getHours().toString(), // 时
    "m+": dateTime.getMinutes().toString(), // 分
    "s+": dateTime.getSeconds().toString(), // 秒
    "S+": dateTime.getMilliseconds()
  };
  for (const k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
      fmt = fmt.replace(
        ret[1],
        ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
      );
    }
  }
  return fmt;
};

/**
 * @description 时间格式化
 * @param dateTime { number } 时间戳
 * @param fmt { string } 时间格式
 * @return { string }
 */
// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
export const timeFormat = (dateTime: number, fmt = "yyyy-mm-dd") => {
  // 如果为null,则格式化当前时间
  if (!dateTime) {
    dateTime = Number(new Date());
  }
  // 如果dateTime长度为10或者13，则为秒和毫秒的时间戳，如果超过13位，则为其他的时间格式
  if (dateTime.toString().length == 10) {
    dateTime *= 1000;
  }
  const date = new Date(dateTime);
  let ret;
  const opt: any = {
    "y+": date.getFullYear().toString(), // 年
    "m+": (date.getMonth() + 1).toString(), // 月
    "d+": date.getDate().toString(), // 日
    "h+": date.getHours().toString(), // 时
    "M+": date.getMinutes().toString(), // 分
    "s+": date.getSeconds().toString(), // 秒
    "S+": dateTime.getMilliseconds()
  };
  for (const k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
      fmt = fmt.replace(
        ret[1],
        ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")
      );
    }
  }
  return fmt;
};

export const randomNo = () => {
  const timestamp = new Date().getTime();
  const randomNum = Math.floor(Math.random() * 10000);
  return `${timestamp}-${randomNum}`;
};
